#ifndef STEP_H
#define STEP_H

#include "go.h"

class Step
{
public:
    Step(unsigned int i); //constructor, i = index

public:

    //公共接口用于写入未被赋值的变量 其中参数中的指针用于数据的拷贝 自身不被改变
    void writeColor(int); //参数非黑即白
    void writeCoordinate(int,int);
    void writeDeadStones(int,int);
    void writeBoard(int (*pboard)[DIMENSION]);
    void writeKo(int (*pko)[DIMENSION]);
    void writeBlock(unsigned int (*pblock)[DIMENSION]);
    void writeAllBlock(map<int,series> *pallblock);
    void writePass();

    //公共接口用于读取相关变量 其中参数中的指针即是输出的对象
    //需要注意的是对于PASS属性的对象, 一部分get操作会返回ERROR(999), 目的是通知GUI执行一些特殊的操作
    unsigned int getIndex();
    int getColor();
    int getCoordinateX();
    int getCoordinateY();
    //void getDeadStones(series *pdeadstones); //dont use , should have error in it
    unsigned int getNumOfDeadStones();
    void getBoard(int (*pboard)[DIMENSION]);
    void getKo(int (*pko)[DIMENSION]);
    void getBlock(unsigned int (*pblock)[DIMENSION]);
    void getAllBlock(map<int,series> *pallblock); //指针需要有固定的内存地址 如Go中的all_block
                                                  //参数输入则为&all_block
                                                  //直接使用指针会出现问题, 具体原因未知
    bool ifPass(); //return isAPass

/* 以下的数据都是恢复到某个之前状态点所必需恢复的数据 */
private:
    bool isAPass; //这手棋是不是PASS的一手
    unsigned int index; //手数 >=1
    int color; //黑-->1 白->-1
    coordinate coo; //棋盘上的位置坐标 coordinate = pair<int,int> (go.h)
    series deadStones; //因为这手棋而被吃掉的子, 为空代表没有提子动作
    int board[DIMENSION][DIMENSION]; //棋盘这手棋之后的瞬间状态数组
    int ko[DIMENSION][DIMENSION]; //棋盘这手棋之后的开劫点记录数组
    unsigned int block[DIMENSION][DIMENSION]; //棋盘这手棋之后的棋块编号数组
    map<int,series> all_block; //棋盘这手棋之后的存放所以现存棋块容器

};

#endif // STEP_H
